//除法函数，用来得到精确的除法结果
//说明：javascript的除法结果会有误差，在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
//调用：$h.Div(arg1,arg2)
//返回值：arg1除以arg2的精确结果
export function Div(arg1, arg2) {
  arg1 = parseFloat(arg1);
  arg2 = parseFloat(arg2);
  var t1 = 0,
    t2 = 0,
    r1, r2;
  try {
    t1 = arg1.toString().split(".")[1].length;
  } catch (e) {
  }
  try {
    t2 = arg2.toString().split(".")[1].length;
  } catch (e) {
  }
  r1 = Number(arg1.toString().replace(".", ""));
  r2 = Number(arg2.toString().replace(".", ""));
  return Mul(r1 / r2, Math.pow(10, t2 - t1));
}

//加法函数，用来得到精确的加法结果
//说明：javascript的加法结果会有误差，在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
//调用：$h.Add(arg1,arg2)
//返回值：arg1加上arg2的精确结果
export function Add(arg1, arg2) {
  arg2 = parseFloat(arg2);
  var r1, r2, m;
  try {
    r1 = arg1.toString().split(".")[1].length
  } catch (e) {
    r1 = 0
  }
  try {
    r2 = arg2.toString().split(".")[1].length
  } catch (e) {
    r2 = 0
  }
  m = Math.pow(100, Math.max(r1, r2));
  return (Mul(arg1, m) + Mul(arg2, m)) / m;
}
//减法函数，用来得到精确的减法结果
//说明：javascript的加法结果会有误差，在两个浮点数相加的时候会比较明显。这个函数返回较为精确的减法结果。
//调用：$h.Sub(arg1,arg2)
//返回值：arg1减去arg2的精确结果
export function Sub(arg1, arg2) {
  arg1 = parseFloat(arg1);
  arg2 = parseFloat(arg2);
  var r1, r2, m, n;
  try {
    r1 = arg1.toString().split(".")[1].length
  } catch (e) {
    r1 = 0
  }
  try {
    r2 = arg2.toString().split(".")[1].length
  } catch (e) {
    r2 = 0
  }
  m = Math.pow(10, Math.max(r1, r2));
  //动态控制精度长度
  n = (r1 >= r2) ? r1 : r2;
  return ((Mul(arg1, m) - Mul(arg2, m)) / m).toFixed(n);
}
//乘法函数，用来得到精确的乘法结果
//说明：javascript的乘法结果会有误差，在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
//调用：$h.Mul(arg1,arg2)
//返回值：arg1乘以arg2的精确结果
export function Mul(arg1, arg2) {
  arg1 = parseFloat(arg1);
  arg2 = parseFloat(arg2);
  var m = 0,
    s1 = arg1.toString(),
    s2 = arg2.toString();
  try {
    m += s1.split(".")[1].length
  } catch (e) {
  }
  try {
    m += s2.split(".")[1].length
  } catch (e) {
  }
  return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
}
export function formatDate(value, args) {
  var dt = new Date(value);
  if (args == 'yyyy-M-d') {// yyyy-M-d
    let year = dt.getFullYear();
    let month = dt.getMonth() + 1;
    let date = dt.getDate();
    return `${year}-${month}-${date}`;
  } else if (args == 'yyyy-M-d H:m:s') {// yyyy-M-d H:m:s
    let year = dt.getFullYear();
    let month = dt.getMonth() + 1;
    let date = dt.getDate();
    let hour = dt.getHours();
    let minute = dt.getMinutes();
    let second = dt.getSeconds();
    return `${year}-${month}-${date} ${hour}:${minute}:${second}`;
  } else if (args == 'yyyy-MM-dd') {// yyyy-MM-dd
    let year = dt.getFullYear();
    let month = (dt.getMonth() + 1).toString().padStart(2, '0');
    let date = dt.getDate().toString().padStart(2, '0');
    return `${year}-${month}-${date}`;
  } else {// yyyy-MM-dd HH:mm:ss
    let year = dt.getFullYear();
    let month = (dt.getMonth() + 1).toString().padStart(2, '0');
    let date = dt.getDate().toString().padStart(2, '0');
    let hour = dt.getHours().toString().padStart(2, '0');
    let minute = dt.getMinutes().toString().padStart(2, '0');
    let second = dt.getSeconds().toString().padStart(2, '0');
    return `${year}-${month}-${date} ${hour}:${minute}:${second}`;
  }
}
export function formatNumber(value) {
  if (!value) return '0.00';
  return parseFloat(value).toFixed(2).replace(/(\.00|\.0)$/, '');
}
export function toChineseNumber(n) {
  // 检查输入是否为自然数
  if (!Number.isInteger(n) && n < 0) {
    throw Error('请输入自然数')
  }
  // 定义中文数字和位置的数组
  const digits = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']
  const positions = ['', '十', '百', '千', '万', '十万', '百万', '千万', '亿', '十亿', '百亿', '千亿']
  // 将输入数字转换为字符串并拆分为字符数组
  const charArray = String(n).split('')
  let result = '' // 存储最终结果的变量
  let prevIsZero = false // 用于标记前一个字符是否为零
  // 处理0
  for (let i = 0; i < charArray.length; i++) {
    const ch = charArray[i] // 获取当前字符
    if (ch !== '0' && !prevIsZero) {
      // 如果当前字符不是零且前一个字符也不是零，则将中文数字和位置添加到结果中
      result += digits[parseInt(ch)] + positions[charArray.length - i - 1]
    } else if (ch === '0') {
      // 如果当前字符是零，则标记前一个字符为零
      prevIsZero = true
    } else if (ch !== '0' && prevIsZero) {
      // 如果当前字符不是零且前一个字符是零，则添加零和中文数字和位置到结果中
      result += '零' + digits[parseInt(ch)] + positions[charArray.length - i - 1]
      prevIsZero = false
    }
  }
  // 处理十
  if (n < 100) {
    // 如果输入数字小于100，则将结果中的“一十”替换为“十”
    result = result.replace('一十', '十')
  }
  return result // 返回最终结果
}
